/*
 * Título: gestHora. Aplicación web de gestión de horarios para conservatorios.
 * Alumnos:
 * - Javier Pardo Muñoz. I.T. Informática de Gestión
 * - Antonio Prior Cazorla. I.T. Informática de Gestión
 * Director: Dr. José Raúl Romero Salguero.
 *     
 *  Copyright (C) 2013 Javier Pardo Muñoz / Antonio Prior Cazorla
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.

 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package es.uco.gesthora.business;

import com.google.gson.Gson;
import es.uco.gesthora.business.gestorRutas.GestorRutas;
import es.uco.gesthora.data.DAO.DAOCopiasSeguridad;
import es.uco.gesthora.data.gestorPropiedades.GestorPropiedades;
import java.io.File;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Vector;

/**
 * Maneja la capa lógica de todo lo relacionado con las copias de seguridad del
 * sistema
 *
 * @author Javier Pardo Muñoz / Antonio Prior Cazorla
 *
 */
public class CopiasDeSeguridad {

    private static CopiasDeSeguridad instance = new CopiasDeSeguridad();
    private String pathSQL = GestorRutas.getInstance().getWebInfPath();
    private String pathFichero = GestorRutas.getInstance().getBackupsBDPath();
    private String pathInstalar = GestorRutas.getInstance().getInstalarPath();
    private DAOCopiasSeguridad dCopiasSeguridad = null;
    private GestorPropiedades GP = null;

    /**
     * Constructor por defecto de la clase
     */
    private CopiasDeSeguridad() {

        dCopiasSeguridad = DAOCopiasSeguridad.getInstance();
        GP = new GestorPropiedades(pathSQL, "BaseDatos.properties");

    }

    /**
     * Devuelve una instancia de la clase usando el patrón Singleton
     *
     * @return Instancia de la clase CopiasDeSeguridad
     */
    public static CopiasDeSeguridad getInstance() {
        return instance;
    }

    /**
     * Realiza las operaciones lógicas necesarias para inicializar y crea la
     * base de datos por primera vez.
     *
     * @param archivoSQL: nombre del archivo SQL a importar
     */
    public void crearBD(String archivoSQL) {

        String usuarioBD = GP.getPropiedad("ConexionDBUser");
        String passwordBD = GP.getPropiedad("ConexionDBPassword");
        String comandoSQL;

        //Crea el comando necesario para importar la BD
        comandoSQL = "mysql -u" + usuarioBD + " -p" + passwordBD + " " + " -e " + "\"" + "source " + pathInstalar + archivoSQL + "\"";
        comandoSQL = comandoSQL.replace("\\", "/");

        //Ejecuta el comando
        try {
            Runtime.getRuntime().exec(comandoSQL.toString());
        } catch (Exception e) {
        }

    }

    /**
     * Realiza las operaciones lógicas necesarias para importar una copia
     * anterior de la base de datos
     *
     * @param archivoSQL: nombre del archivo SQL a importar
     */
    public void importarCopia(String archivoSQL) {

        String usuarioBD = GP.getPropiedad("ConexionDBUser");
        String passwordBD = GP.getPropiedad("ConexionDBPassword");
        String comandoSQL;

        //Crea el comando necesario para importar la BD
        comandoSQL = "mysql -u" + usuarioBD + " -p" + passwordBD + " gesthora " + " -e " + "\"" + "source " + pathFichero + "/" + archivoSQL + "\"";
        comandoSQL = comandoSQL.replace("\\", "/");

        //Ejecuta el comando
        try {
            Runtime.getRuntime().exec(comandoSQL.toString());
        } catch (Exception e) {
        }

    }

    /**
     *
     * Realiza las operaciones lógicas necesarias para crear una copia de la
     * base de datos a un fichero
     *
     * @param archivoSQL: nombre del archivo SQL a importar
     *
     * @return true si se crea correctamente / false si falla
     * @throws InstantiationException
     */
    public boolean crearCopia(String texto) throws InstantiationException {

        int resultado = 0;

        String usuarioBD = GP.getPropiedad("ConexionDBUser");
        String passwordBD = GP.getPropiedad("ConexionDBPassword");

        //Crea las variables necesarias para controlar la hora del sistema
        Date d = new Date();
        Calendar c = new GregorianCalendar();
        c.setTime(d);

        //Se crea el nombre de archivo con el formato DIA_MES_AÑO_HORA_MIN_SEG 
        String nombreArchivo = Integer.toString(c.get(Calendar.DATE)) + "_"
                + Integer.toString(c.get(Calendar.MONTH)) + "_" + Integer.toString(c.get(Calendar.YEAR)) + "_"
                + Integer.toString(c.get(Calendar.HOUR_OF_DAY)) + "_" + Integer.toString(c.get(Calendar.MINUTE)) + "_"
                + Integer.toString(c.get(Calendar.SECOND)) + ".sql";

        //Crea el comando necesario para crear la copia
        String comandoSQL;
        comandoSQL = "mysqldump --opt -u" + usuarioBD + " -p" + passwordBD + " gesthora --result-file=" + "\"" + pathFichero + "/" + nombreArchivo + "\"";
        comandoSQL = comandoSQL.replace("\\", "/");

        //Ejecuta el comando
        try {
            Runtime.getRuntime().exec(comandoSQL.toString());
        } catch (Exception e) {
        }

        //Añade la copia a la base de datos
        resultado = dCopiasSeguridad.anadir(nombreArchivo, texto);

        if (resultado != 0) {
            return true;
        } else {
            return false;
        }

    }

    /**
     * Realiza las operaciones lógicas necesarias para eliminar una copia de la
     * base de datos del sistema
     *
     * @param id: id de la copia a eliminar
     * @param nombreFichero: nombre del fichero de la copia
     * @return true si se elimina correctamente / false si falla
     */
    public boolean eliminarCopia(int id, String nombreFichero) {

        int resultado;

        //Elimina la copia de la base de datos
        resultado = dCopiasSeguridad.eliminar(id);

        //Elimina el fichero físico
        File f = new File(pathFichero + "/" + nombreFichero);
        f.delete();

        if (resultado != 0) {
            return true;
        } else {
            return false;
        }

    }

    /**
     * Realiza las operaciones lógicas necesarias para listar todas las copias
     * de seguridad disponibles en el sistema
     *
     * @return cadena con formato JSON que contiene toda la información de las
     * copias
     */
    public String listarCopias() {

        Vector listado = null;
        String resultado = "";

        //Obtiene todas las copias disponibles en la base de datos
        listado = dCopiasSeguridad.seleccionarTodo();

        //Convierte el resultado a una cadena JSON
        if (!listado.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(listado);
        } else {
            resultado = "Vacio";
        }

        return resultado;
    }
}
